﻿using System;
using System.Collections.Generic;
using System.Net.Mail;
using System.Net;
using System.IO;
using System.Net.Mime;
using System.Text;

namespace Locadora.BLL
{
    public class EmailBLL
    {

        #region Atributos
        
        private readonly MailMessage _mail = new MailMessage();
        private readonly SmtpClient _smtpClient = new SmtpClient();

        private readonly string _senhaConta;


        private readonly NetworkCredential _credentials;
        
        #endregion

        #region Propriedades

        public string senhaConta
        {
            get { return _senhaConta; }
        }

        public string De {get; set;}
        public string EmailNotificacaoLeitura { get; set; }
        public string Assunto {get; set; }

        public string Mensagem {get; set;}
        
        public string Servidor{get; set;}


        public List<Attachment> AttachmentList { get; set; }

        public Attachment Attachment { get; set; }

        public MailPriority MailPriority {get; set;}


        public bool IsBodyHTML {get; set;}

        public Int32 Porta {get; set; }

        public bool HabilitarSSL {get; set;}
        
        public Int32 TimeOut {get; set; }
        

        #endregion


        public EmailBLL(string conta, string senha)
        {
            _senhaConta = senha;
            _credentials = new NetworkCredential(conta, senha);
        }

        public EmailBLL()
        {
   
        }
        #region Métodos

        /// <summary>
        /// Adiciona endereço de email principal (TO)
        /// </summary>
        /// <param name="email"></param>
        public void AddPara(string email)
        {
            _mail.To.Add(email);    
        }

        /// <summary>
        /// Adiciona endereço de email cópia(CC)
        /// </summary>
        /// <param name="email"></param>
        public void AddCopia(string email)
        {
            _mail.CC.Add(email);
        }

        /// <summary>
        /// Adiciona endereço de email oculto (Bcc)
        /// </summary>
        /// <param name="email"></param>
        public void AddCopiaOculta(string email)
        {
            _mail.Bcc.Add(email);
        }

        /// <summary>
        /// Adiciona um arquivo como anexo no email
        /// </summary>
        /// <param name="attachmentStream">Arquivo à ser anexado</param>
        /// <param name="nome">Nome do Anexo</param>
        /// <param name="tipoMidia">Exemplo do Word: "applicaiton/vnd.ms-word"</param>
        public void AddAttachment(Stream attachmentStream, string nome, string tipoMidia)
        { 
            Attachment attach = new Attachment(attachmentStream, nome, tipoMidia);
                //"applicaiton/vnd.ms-word");
            _mail.Attachments.Add(attach);
        }

        private void ConfigurarEmail()
        {
            

            _mail.From = new MailAddress(De); 
            _mail.Subject = Assunto;

            StringBuilder sb = new StringBuilder();
            sb.Append("<html xmlns:res2=\"http://www.w3.org/1999/XSL/Transform-Result2\" xmlns:user=\"http://www.microsoft.com/MSCOM/Service/Pens/2.0/Functions\">");

            sb.Append("<head><META http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\"></head>");
            sb.Append("<body bgcolor=\"#FFFFFF\" style=\"font-family: Verdana, Arial, Helvetica, sans-serif; margin: 0px;\">");
            sb.Append("<table cellpadding=\"0\" cellspacing=\"0\">");
            sb.Append("<tr><td>");
            sb.Append("<img alt=\"\" hspace=0 src=\"cid:imageId\" align=baseline border=0 >");
            sb.Append("</td>");
            sb.Append("<td><font face=verdana size=\"2\">" + Mensagem + "</font>");
            sb.Append("</td></tr>");
            sb.Append("</table>");
            sb.Append("</body>");
            sb.Append("</html>");            
            
            AlternateView txtView = AlternateView.CreateAlternateViewFromString(Mensagem,  null, "text/plain");;

            AlternateView htmlView = AlternateView.CreateAlternateViewFromString(sb.ToString(), null, "text/html");
            //Nao sei pq essa porra nao anexa a imagem quando transformo em memorystream... saco
            //MemoryStream st = new MemoryStream();
            //System.Drawing.Image imagem = Properties.Resources.DVDShare;
            //imagem.Save(st, System.Drawing.Imaging.ImageFormat.Gif);
            //LinkedResource imagelink = new LinkedResource(st, MediaTypeNames.Image.Gif);
            //@"C:\Wiki\WIKI\WikiLoca\MvcMembership\Content\images\DVDShare.gif"

            LinkedResource imagelink = new LinkedResource(@"C:\temp\DVDShareLogo.jpg", MediaTypeNames.Image.Gif);
            imagelink.ContentId = "imageId";
            imagelink.TransferEncoding = TransferEncoding.Base64;
            htmlView.LinkedResources.Add(imagelink);
            
            _mail.AlternateViews.Add(txtView);
            _mail.AlternateViews.Add(htmlView);

            _mail.Body = Mensagem;
            _mail.Priority = MailPriority;
            _mail.IsBodyHtml = IsBodyHTML;
            _mail.SubjectEncoding = System.Text.Encoding.GetEncoding("ISO-8859-1");
            _mail.BodyEncoding = System.Text.Encoding.GetEncoding("ISO-8859-1");

            _mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess;
            if (EmailNotificacaoLeitura==string.Empty )
                EmailNotificacaoLeitura=De;
        
            _mail.Headers.Add("Disposition-Notification-To", "<" + EmailNotificacaoLeitura + ">");
            _mail.Headers.Add("Message-ID", "<>");
        }

        private void ConfigurarSmtpClient()
        {
            _smtpClient.Host = Servidor;
            _smtpClient.Port = Porta <= 0 ? 25 : Porta;

            if (TimeOut > 0)
                _smtpClient.Timeout = TimeOut;


            _smtpClient.EnableSsl = HabilitarSSL;
            _smtpClient.Credentials = _credentials;
            //_smtpClient.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis;
        }


        public void Enviar()
        {
            object userState;
            ConfigurarEmail();
            ConfigurarSmtpClient();

            try
            {
                //Tenta enviar por via normal (Terra)
                //_smtpClient.Send(_mail);
                 userState = _mail;
                //_smtpClient.SendAsync(_mail, userState);
                _smtpClient.Send(_mail);

            }

                //Se der um erro tenta enviar pelo amx
            catch (SmtpException ex)
            {
                //Logging.EventLogCL.Inserir("Erro na primeira tentativa." + ex.ToString(), EventLogEntryType.Error);

                if (ex.StatusCode == SmtpStatusCode.MailboxBusy ||
                    ex.StatusCode == SmtpStatusCode.MailboxUnavailable)
                {
                    //ConfigurarSmtpClientAmx();
                    ConfigurarSmtpClient();
                    userState = _mail;
                    _smtpClient.SendAsync(_mail, userState);
                }
                else
                {
                    throw new Exception("Falha ao enviar e-mail! " +  ex.Message);
                }
            }
            finally
            {
                _mail.Dispose();
            }
        }

        
        public void SpeedMail(string dsDe, string dsPara, string dsAssunto, string dsTexto)
        {
            //mudar isso pra MailCompLine pra usar dentro da comp! ou comente as proximas duas linhas
            //SpeedMaiGmail(dsDe,dsPara,dsAssunto,dsTexto);
            //return;
            EmailBLL email = new EmailBLL("desenvolvedor@complinebsb", "Desenvk0pz"); ;//EmailBLL email = new EmailBLL("dvdshare@wikicode.com.br", "87B289");
            email.AddPara(dsPara);

            //email.AddCopia("willon@compline.inf.br");
            email.Assunto = dsAssunto;
            email.De = dsDe;
            email.IsBodyHTML = true;
            email.Mensagem = dsTexto;
            email.EmailNotificacaoLeitura = "felipe@compline.inf.br";
            //email.HabilitarSSL = true;                    
            email.MailPriority = System.Net.Mail.MailPriority.Normal;
            email.Servidor = "gaviao.complinebsb";

            email.Enviar();

        }
 
        public void SpeedMailCompLine(string dsDe, string dsPara, string dsAssunto, string dsTexto)
        {
            EmailBLL email = new EmailBLL("desenvolvedor@complinebsb", "Desenvk0pz"); ;//EmailBLL email = new EmailBLL("dvdshare@wikicode.com.br", "87B289");

            email.AddPara(dsPara);            
            email.Assunto = dsAssunto;
            email.De = dsDe;
            email.IsBodyHTML = true;
            email.Mensagem = dsTexto;
            email.EmailNotificacaoLeitura = "felipe@compline.inf.br";
            //email.HabilitarSSL = true;                    

            email.MailPriority = System.Net.Mail.MailPriority.Normal;
            email.Servidor = "gaviao.complinebsb";
            email.Enviar();
        }
        public void SpeedMaiGmail(string dsDe, string dsPara, string dsAssunto, string dsTexto)
        {
            EmailBLL email = new EmailBLL("dvdshare@wikicode.com.br", "87B289");
            email.AddPara(dsPara);
            email.Assunto = dsAssunto;
            email.De = "Wiki DVD Share <dvdshare@wikicode.com.br>";
            email.AddCopia("felipe@wikicode.com.br");
            email.IsBodyHTML = true;
            email.Mensagem = dsTexto;
            email.EmailNotificacaoLeitura = "felipe@wikicode.com.br";
            email.HabilitarSSL = true;                    
            email.MailPriority = System.Net.Mail.MailPriority.Normal;
            email.Servidor = "smtp.gmail.com";
            email.Porta = 587;
            email.Enviar();
        }
        #endregion
    }

   /*
 * --------------------           COMP LINE INFORMÁTICA LTDA       --------------------------
 * CLASSE: Classe para envio de email atraves do serviço que varre o banco db_gerencia
 * AUTOR: FÉLIX, WILLON
 * DATA CRIAÇÃO: 15/05/2008
 * DESCRICAO: 
 *
 * MODIFICADO POR:
 * DATA MODIFICAÇÃO:
 * ------------------------------------------------------------------------------------------
*/
    //public class CorreioViaBanco
    //{
    //    private TB_FILA_EMAIL m_TbFila = null;
    //    public CorreioViaBanco(TB_FILA_EMAIL tb)
    //    {
    //        this.m_TbFila = tb;
    //    }

    //    public void Enviar()
    //    {
    //        FilaEmailBLL fila = new FilaEmailBLL();
    //        fila.Inserir(m_TbFila);
    //    }
    //}
}
